//-----------------------------------------------------------------------------
// Copyright (C) 2017 Merlok
//
// This code is licensed to you under the terms of the GNU GPL, version 2 or,
// at your option, any later version. See the LICENSE.txt file for the text of
// the license.
//-----------------------------------------------------------------------------
// APDU status bytes information
//-----------------------------------------------------------------------------

#ifndef APDUINFO_H__
#define APDUINFO_H__

#include "util.h"


#define APDUCODE_TYPE_NONE     0
#define APDUCODE_TYPE_INFO     1
#define APDUCODE_TYPE_WARNING  2
#define APDUCODE_TYPE_ERROR    3
#define APDUCODE_TYPE_SECURITY 4

typedef struct {
	const char *ID;
	const uint8_t Type;
	const char *Description;
} APDUCode;

typedef struct {
	uint8_t CLA;
	uint8_t INS;
	uint8_t P1;
	uint8_t P2;
	uint8_t Lc;
	uint8_t *data;
} PACKED sAPDU;

typedef struct {
	uint8_t cla;
	uint8_t ins;
	uint8_t p1;
	uint8_t p2;
	uint8_t lc[3];
} PACKED ExtAPDUHeader;

typedef struct {
	uint8_t cla;
	uint8_t ins;
	uint8_t p1;
	uint8_t p2;
	uint16_t lc;
	uint8_t *data;
	uint32_t le;
	bool extended_apdu;
	uint8_t case_type;
} PACKED APDUStruct;

extern const APDUCode *GetAPDUCode(uint8_t sw1, uint8_t sw2);
extern const char *GetAPDUCodeDescription(uint8_t sw1, uint8_t sw2);
extern int APDUDecode(uint8_t *data, int len, APDUStruct *apdu);
extern int APDUEncode(APDUStruct *apdu, uint8_t *data, int *len);
extern int APDUEncodeS(sAPDU *apdu, bool extended, uint16_t le, uint8_t *data, int *len);
extern void APDUPrint(APDUStruct apdu);
extern void APDUPrintEx(APDUStruct apdu, size_t maxdatalen);

#endif
